package com.fiume.travel.service.impl;

import com.fiume.travel.mapper.FavoriteMapper;
import com.fiume.travel.mapper.RouteMapper;
import com.fiume.travel.mapperExt.FavoriteMapperExt;
import com.fiume.travel.mapperExt.RouteMapperExt;
import com.fiume.travel.pojo.Favorite;
import com.fiume.travel.pojo.FavoriteExample;
import com.fiume.travel.pojo.Route;
import com.fiume.travel.service.AffixService;
import com.fiume.travel.service.FavoriteService;
import com.fiume.travel.utils.BeanConv;
import com.fiume.travel.utils.EmptyUtil;
import com.fiume.travel.vo.AffixVo;
import com.fiume.travel.vo.FavoriteVo;
import com.fiume.travel.vo.RouteVo;
import com.fiume.travel.vo.UserVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * <p>
 * Description: 收藏模块实现类
 * </p>
 *
 * @author fiume
 * @version v1.0.0
 * @create 2021-02-13 23:21
 * @see com.fiume.travel.service.impl
 */
@Service
public class FavoriteServiceImpl implements FavoriteService {

    @Resource
    private FavoriteMapper favoriteMapper;

    @Resource
    private HttpSession session;

    @Resource
    private RouteMapper routeMapper;

    @Resource
    private RouteMapperExt routeMapperExt;

    @Resource
    private FavoriteMapperExt favoriteMapperExt;

    @Resource
    private AffixService affixService;
    /**
     * 添加收藏
     *
     * @param favoriteVo
     * @return 当前线路收藏人数
     */
    @Override
    public Integer addFavorite(FavoriteVo favoriteVo) {
        //1.从session中获取用户对象
        UserVo userVo = (UserVo) session.getAttribute(session.getId());
        if (userVo == null) {
            //用户未登录
            return null;
        }
        //2. 向favorite中间表插入数据
        //完善vo数据
        favoriteVo.setUserId(userVo.getId());
        //将前端传入的对象中的有效值拷贝到pojo对象中
        Favorite favorite = BeanConv.toBean(favoriteVo, Favorite.class);
        //向收藏表(用户线路关联关系表)中插入数据
        int i = favoriteMapper.insert(favorite);
        //3. 通过自定义mapper将route表中的收藏次数+1
        int j = routeMapperExt.updateRouteCountById(favoriteVo.getRouteId());
        //4. 查询route表中的收藏人数并返回
        if (i>0 && j>0){
            Route route = routeMapper.selectByPrimaryKey(favoriteVo.getRouteId());
            return route.getAttentionCount();
        }
        //TODO: 统一返回数据
        //其他情况证明操作失败,返回错误
        return null;
    }

    /**
     * 分页查询当前用户的收藏线路
     *
     * @param favoriteVo
     * @param pageNum    分页:当前页
     * @param pageSize   分页:显示条数
     * @return 线路信息
     */
    @Override
    public PageInfo<RouteVo> findMyFavorite(FavoriteVo favoriteVo, int pageNum, int pageSize) {
        //1. 将分页数据存入ThreadLocal中,即将pageNum和pageSize绑定到当前线程上
        // 由此,我发现PageHelper实际做的事情是在 ThreadLocal中设置了分页参数，之后在查询执行的时候，获取当线程中的分页参数，执行查询的时候通过拦截器在sql语句中添加分页参数，之后实现分页查询，查询结束后在 finally 语句中清除ThreadLocal中的查询参数
        PageHelper.startPage(pageNum,pageSize);
        //2. 获取当前用户ID
        //从session中取出用户对象
        UserVo userVo = (UserVo) session.getAttribute(session.getId());
        //判断用户是否存在
        if (EmptyUtil.isNullOrEmpty(userVo)){
            return null;
        }
        //3. 查到的用户数据不为空时,从用户对象中获取用户id
        Long userId = userVo.getId();
        //4. 获取当前用户收藏的线路信息
        //通过userId为条件进行线路表和收藏表的多表联查
        List<Route> routeList = favoriteMapperExt.findFavoriteByUserId(userId);
        //5. 封装查询结果集,而分页查询的所有结果会自动的封装到第一个pageInfo对象中(基本数据)
        //bug解决(必须在查出数据后立即将之存入PageInfo中):
        //当前页查询的数据
        PageInfo<Route> routePageInfo = new PageInfo<>(routeList);
        //由于beanConv只是将简单属性拷贝,无法将list拷贝到新对象中,故对象拷贝分为两步
        PageInfo<RouteVo> resultPageInfo = new PageInfo<>();
        //6. 将结果转换为返回值要求的对象返回
            //6.1 拷贝属性
        BeanConv.toBean(routePageInfo,resultPageInfo);
            //6.2 拷贝结果集
        List<RouteVo> routeVoList = BeanConv.toBeanList(routePageInfo.getList(), RouteVo.class);
        resultPageInfo.setList(routeVoList);
        //处理图片
        for (RouteVo routeVoHandler : routeVoList) {
            AffixVo affixVo = AffixVo.builder().businessId(routeVoHandler.getId()).build();
            routeVoHandler.setAffixVoList(affixService.findAffixByBusinessId(affixVo));
        }
        // 返回结果
        return resultPageInfo;
    }

    /**
     * 是否收藏
     *
     * @param favoriteVo
     * @return 是否收藏
     */
    @Override
    public Boolean isFavorited(FavoriteVo favoriteVo) {
        //1. 获取当前用户
        //从session中取出用户对象
        UserVo userVo = (UserVo) session.getAttribute(session.getId());
        //判断用户是否存在
        if (EmptyUtil.isNullOrEmpty(userVo)){
            return null;
        }
        //2. 获取用户id
        Long userId = userVo.getId();

        //3. 根据用户id和线路id查询用户是否收藏当前线路
        FavoriteExample example = new FavoriteExample();
        example.createCriteria()
                .andRouteIdEqualTo(favoriteVo.getRouteId())
                .andUserIdEqualTo(userId);
        List<Favorite> favoriteList = favoriteMapper.selectByExample(example);
        return favoriteList.size() > 0;
    }
}
